package com.itheima.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.entity.QueryPageBean;
import com.itheima.mapper.CheckGroupMapper;
import com.itheima.mapper.SetMealMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import com.itheima.resources.RedisConstant;
import com.itheima.service.SetMealService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Service
@Transactional
public class SetMealServiceImpl implements SetMealService {
    //注入持久层
    @Autowired
    private SetMealMapper setMealMapper;

    @Autowired
    private CheckGroupMapper checkGroupMapper;

    @Autowired
    private JedisPool jedisPool;

    @Override
    public void addSetMeal(Setmeal setMeal, Integer[] checkGroupIds) {
        //添加普通项,添加完成后数据库的主键id会返回到对象的id属性中
        setMealMapper.addSetMeal(setMeal);

        //获取一个连接对象
        Jedis jedis = jedisPool.getResource();
        if (setMeal.getImg()!=null){
            //将文件名作为value值存储到redis的set中去 key值为固定值, 意指存储到数据库中去了.
            jedis.sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,setMeal.getImg());
        }

        System.out.println("添加到数据库的图片名已存到redis中");

        //返还连接对象
        jedis.close();

        //获取setMeal的id值(主键id)
        Integer sId = setMeal.getId();

        //添加套餐表和检查组表的中间表数据
        for (Integer gId : checkGroupIds) {
            setMealMapper.addSetMealAndCheckGroupBy(sId,gId);
        }

    }

    /***
     * 查询当前页的套餐数据
     * @param queryPageBean 页面对象(页码值,页面展示数量,页面复杂查询时的搜索条件)
     * @return Map,封装了当前页面的数据,根据搜索条件查询到的所有数据条数.
     */
    @Override
    public Map findPageSetMeal(QueryPageBean queryPageBean) {
        //注入页码,页面展示数量值
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        //传入搜索条件查询页面数据
        List<Setmeal> setMealList = setMealMapper.findPageSetMealByCondition(queryPageBean.getQueryString());
        //定义分页插件对象
        PageInfo<Setmeal> PageInfo = new PageInfo<>(setMealList);

        //定义map
        Map map=new HashMap();
        map.put("setMealList",PageInfo.getList());
        map.put("total",PageInfo.getTotal());
        return map;
    }

    /***
     * 修改套餐时,回显已勾选的检查组数据
     * @param id 套餐id
     * @return map 值1.所有的检查组信息 值2.已勾选的检查组id 数组
     */
    @Override
    public Map echoCheckGroupIds(Integer id) {
        //查询所有的检查组信息
        List<CheckGroup> checkGroupList = checkGroupMapper.findAllCheckGroup();

        //查询当前套餐已勾选的检查组信息
        Integer[] checkGroupIds=setMealMapper.echoCheckGroupIds(id);

        //定义map集合
        Map map=new HashMap();
        map.put("checkGroupList",checkGroupList);
        map.put("checkGroupIds",checkGroupIds);
        return map;
    }

    /***
     * 删除指定套餐
     * @param id 套餐id值
     */
    @Override
    public void deleteSetMeal(Integer id) {
        //先删除中间表(子表)的数据
        setMealMapper.deleteSetMealAndCheckGroup(id);

        //再删除套餐表(父表)的数据,不然会sql异常.
        setMealMapper.deleteSetMeal(id);
    }

    /***
     * 修改指定套餐数据
     * @param setMeal 单个套餐的普通项数据
     * @param checkGroupIds  套餐的检查组勾选项
     */
    @Override
    public void updateSetMeal(Setmeal setMeal, Integer[] checkGroupIds) {
        //获取当前套餐的id值
        Integer id = setMeal.getId();

        //修改该套餐普通项信息
        setMealMapper.updateCheckGroup(setMeal);

        //注意: 修改中间表信息之前要先移除之前的中间表信息,再添加新的中间表信息
        //移除
        setMealMapper.removeSetMealAndCheckGroupBySetMealId(id);

        //添加
        for (Integer checkGroupId : checkGroupIds) {
            setMealMapper.addSetMealIdAndCheckGroupId(id,checkGroupId);
        }
    }

    /***
     * 查询所有套餐
     * @return List<SetMeal>查询到的所有套餐数据
     * @param queryPageBean
     */
    @Override
    public Map findAllSetMeal(QueryPageBean queryPageBean) {
        //注入页码值和页面展示数量值
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());

        //调用持久层查询数据
        List<Setmeal> setMealList=setMealMapper.findAllSetMeal(queryPageBean.getQueryString());

        //定义分页插件对象
        PageInfo<Setmeal> pageInfo = new PageInfo<>(setMealList);

        //定义map集合
        Map map = new HashMap();
        map.put("setMealList",pageInfo.getList());
        map.put("total",pageInfo.getTotal());
        return map;
    }

    /***
     * 查询单个套餐详细数据
     * @param setMealId 指定的套餐id值
     * @return 套餐数据
     */
    @Override
    public Setmeal findSetMealDetailById(String setMealId) {
        //先查询当前套餐
        Setmeal setmeal = setMealMapper.findSetMealCommonById(setMealId);

        //根据id查询当前套餐的所有检查组
        List<CheckGroup> checkGroupList = setMealMapper.findCheckGroupById(setMealId);

        //遍历检查组数组
        for (CheckGroup checkGroup : checkGroupList) {
            //获取id值
            Integer checkGroupId = checkGroup.getId();
            //根据检查组的id查询所有的检查项数据
            List<CheckItem> checkItemList = setMealMapper.findCheckItemByCheckGroupId(checkGroupId);

            //赋值给到检查组对象的属性
            checkGroup.setCheckItems(checkItemList);
        }
        //赋值
        setmeal.setCheckGroups(checkGroupList);

        return setmeal;
    }

    /***
     * 查询单个套餐的基础数据
     * @param setMealId 套餐id值
     * @return 套餐数据
     */
    @Override
    public Setmeal findSetMealCommonById(String setMealId) {
        return setMealMapper.findSetMealCommonById(setMealId);
    }
}
